package com.anabur.services;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.anabur.persistent.Empresa;
import com.anabur.pojos.filtro.Filtro;
import com.anabur.pojos.resultados.Results;

/**
 * Interfaz que define los metodos que debe poder calcular cualquier implementacion del calculatorEngine
 * @author Pablo
 *
 */
public interface CalculatorEngine {
	
	public static String PASQUALI_METHOD = "P";
	public static String STD_METHOD = "S";
	/**
	 * Este metodo sirve para obtener el ranking general segun ROE y PER juntos en un fecha determinada
	 * 
	 * @param empresas
	 * @param fecha
	 * @param calculationMethod
	 * @return listado de empresas rankeadas
	 */
	public List obtenerRankingGeneral(List<Empresa> empresas, Date fecha, String calculationMethod) throws Exception;
	
	/**
	 * Este metodo sirve para obtener el ranking general segun PER en un fecha determinada 
	 * 
	 * @param empresas
	 * @param fecha
	 * @return listado de empresas rankeadas por PER
	 */
	public List obtenerRankingPER(List<Empresa> empresas, Date fecha) throws Exception;
	
	/**
	 * Este metodo sirve para obtener el ranking general segun ROE en un fecha determinada 
	 * 
	 * @param empresas
	 * @param fecha
	 * @return listado de empresas rankeadas por PER
	 */
	public List obtenerRankingROE(List<Empresa> empresas, Date fecha) throws Exception;
	
	/**
	 * Devuelve el rendimiento porcentual anualizado del Merval entre 2 fechas dadas 
	 * @param desde
	 * @param hasta
	 * @return rendimiento del merval anualizado
	 */
	public BigDecimal calcularRendimientoAnualizadoMerval(Date desde, Date hasta) throws Exception;
	
	/**
	 * Este metodo es el encargado de calcular el ROE para una fecha dada.
	 * El ROE se calcula como (Ganancia + R. Extraordinarios) / Patrimonio 
	 * 
	 * @param fecha
	 * @return ROE
	 */
	public BigDecimal calcularROE(Date fecha, Empresa empresa) throws Exception;
	
	/**
	 * Este metodo es el encargado de calcular el PER para una fecha dada.
	 * El PER se calcula como Cotizacion / Ganancia por accion
	 * donde ganancia por accion = (Ganancia + R. Extraordinarios) / Capital Suscripto
	 * @param fecha
	 * @return PER
	 */
	public BigDecimal calcularPER(Date fecha, Empresa empresa) throws Exception;
	
	/**
	 * Este metodo devuelve los resultados del procesamiento de datos segun los filtros ofrecidos como paramentros
	 * 
	 * @param filtro
	 * @return resultados del procesamiento
	 */
	public Results procesarDatos(Filtro filtro) throws Exception;
}
